home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / ABUSESRC.ZIP / AbuseSrc / macabuse / imlib / filesel.c < prev    next >
C/C++ Source or Header  |  1997-05-20  |  4KB  |  159 lines

  1. #include "filesel.hpp"
  2. #include "input.hpp"
  3. #include "scroller.hpp"
  4. #include "jdir.hpp"
  5.  
  6. #ifdef __WATCOMC__
  7. #include <direct.h>
  8. #endif
  9.  
  10. #ifdef __MAC__
  11. extern char *macify_name(char *s);
  12. #endif
  13.  
  14. class file_picker : public spicker
  15. {
  16.   char **f,**d;
  17.   int tf,td,wid,sid;
  18.   char cd[300];
  19.   public:
  20.   file_picker(int X, int Y, int ID, int Rows, ifield *Next);
  21.   virtual int total() { return tf+td; }
  22.   virtual int item_width(window_manager *wm) { return wm->font()->width()*wid; }
  23.   virtual int item_height(window_manager *wm) { return wm->font()->height()+1; }
  24.   virtual void draw_item(window_manager *wm, image *screen, int x, int y, int num, int active);
  25.   virtual void note_selection(window_manager *wm, image *screen, input_manager *inm, int x);
  26.   void free_up();
  27.   ~file_picker() { free_up(); }
  28. } ; 
  29.  
  30. void file_picker::free_up()
  31. {
  32.   int i=0;
  33.   for (;i<tf;i++)
  34.     jfree(f[i]);
  35.   for (i=0;i<td;i++)
  36.     jfree(d[i]);
  37.   if (tf) jfree(f);
  38.   if (td) jfree(d);
  39. }
  40.  
  41. void file_picker::note_selection(window_manager *wm, image *screen, input_manager *inm, int x)
  42. {
  43.   if (x<td)
  44.   {
  45.     if (strcmp(d[x],"."))
  46.     {
  47.       int x1,y1,x2,y2;
  48.       area(x1,y1,x2,y2,wm);
  49.       screen->bar(x1,y1,x2,y2,wm->medium_color());
  50.  
  51.       char st[200],curdir[200];
  52.       sprintf(st,"%s/%s",cd,d[x]);
  53.       
  54. #ifdef __MAC__
  55.             if (strcmp(d[x],".."))
  56.                 strcpy(cd,st);
  57.             else
  58.             {
  59.                 int i=strlen(cd);
  60.                 
  61.                 if (cd[i-1] == '.' && cd[i-2] == '.')
  62.                     strcpy(cd,st);
  63.                 else
  64.                 {
  65.                     while (i>=0 && cd[i] != '/')
  66.                         i--;
  67.                     if (i>=0)
  68.                         cd[i] = 0;
  69.                 }
  70.             }                
  71. #else
  72.       getcwd(curdir,200);
  73. #ifdef __MAC__
  74.       chdir(macify_name(st));
  75. #else
  76.             chdir(st);
  77. #endif
  78.       getcwd(cd,200);
  79.       chdir(curdir);
  80. #endif
  81.       free_up();
  82.       get_directory(cd,f,tf,d,td);
  83.       wid=0;
  84.       int i=0;
  85.       for (;i<tf;i++)
  86.       if (strlen(f[i])>wid) wid=strlen(f[i]);
  87.       for (i=0;i<td;i++)
  88.       if (strlen(d[i])+2>wid) wid=strlen(d[i])+2;
  89.       sx=0;
  90.  
  91.       reconfigure();  
  92.       draw_first(screen,wm);
  93.     }
  94.   } else
  95.   {
  96.     char nm[200];
  97.     sprintf(nm,"%s/%s",cd,f[x-td]);
  98.     text_field *link=(text_field *)inm->get(sid);
  99.     link->change_data(nm,strlen(nm),1,screen,wm);
  100.   }
  101.  
  102. }
  103.  
  104. void file_picker::draw_item(window_manager *wm, image *screen, int x, int y, int num, int active)
  105. {
  106.   if (active)
  107.     screen->bar(x,y,x+item_width(wm)-1,y+item_height(wm)-1,wm->black());
  108.  
  109.   if (num<td)
  110.   {
  111.     char st[100];
  112.     sprintf(st,"<%s>",d[num]);
  113.     wm->font()->put_string(screen,x,y,st,wm->bright_color());
  114.   } else
  115.     wm->font()->put_string(screen,x,y,f[num-td],wm->bright_color());
  116. }
  117.  
  118. file_picker::file_picker(int X, int Y, int ID, int Rows, ifield *Next)
  119.   : spicker(X,Y,0,Rows,1,1,0,Next)
  120. {
  121.   
  122.   sid=ID;
  123.  
  124.   strcpy(cd,".");
  125.  
  126.   get_directory(cd,f,tf,d,td);
  127.   wid=0;
  128.   int i=0;
  129.   for (;i<tf;i++)
  130.     if (strlen(f[i])>wid) wid=strlen(f[i]);
  131.   for (i=0;i<td;i++)
  132.     if (strlen(d[i])+2>wid) wid=strlen(d[i])+2;
  133.   reconfigure();  
  134. }
  135.  
  136. jwindow *file_dialog(window_manager *wm, char *prompt, char *def,
  137.              int ok_id, char *ok_name, int cancel_id, char *cancel_name, char *FILENAME_str, int filename_id)
  138. {
  139.   int wl=WINDOW_FRAME_LEFT,wh=WINDOW_FRAME_TOP;
  140.   int wh2=wh+5+wm->font()->height()+5;
  141.   int wh3=wh2+wm->font()->height()+12;
  142.   jwindow *j=wm->new_window(0,0,-1,-1,
  143.                 new info_field(wl+5,wh+5,0,prompt,
  144.                             new text_field(wl,wh2,filename_id,
  145.                        ">","****************************************",def,
  146.                 new button(wl+50,wh3,ok_id,     ok_name,
  147.                 new button(wl+100,wh3,cancel_id,cancel_name,
  148.                 new file_picker(wl+15,wh3+wm->font()->height()+10,filename_id,8,
  149.                       NULL))))),
  150.  
  151.                 FILENAME_str);
  152.   return j;
  153. }
  154.  
  155.  
  156.  
  157.  
  158.  
  159.